// cf-509f
// 题意：给定一个深搜程序（将树的节点按小到大排序后，类似中序遍历）遍历树
//       得到一个节点的遍历序列，现在给定一个序列（n的排列），问有多少
//       种树（邻接矩阵）满足这个遍历序列。
//
// 题解：画个图观察下。然后f[l][r]表示l到r这段序列对应树的个数，
//       g[l][r]表示某一个节点下l到r这段区间的树的个数，如果还有同一层的
//       兄弟，那么兄弟的第一个数要比b[l]大。
//       f[l][r]和g[l][r]的转移很类似。
//
// run: $exec < input
#include <iostream>

long long const mo = 1000000007;
int const maxn = 507;
long long f[maxn][maxn];
long long g[maxn][maxn];
int b[maxn];
int n;

long long dp1(int l, int r);

long long dp2(int l, int r)
{
	if (g[l][r] != -1) return g[l][r];
	if (l == r) return 1;
	auto ret = 0ll;
	for (int i = l; i <= r; i++) {
		if (i < r && b[i + 1] > b[l])
			ret = (ret + (dp1(l, i) * dp2(i + 1, r)) % mo) % mo;
		else if (i == r)
			ret = (ret + dp1(l, i)) % mo;
	}
	return g[l][r] = ret;
}

long long dp1(int l, int r)
{
	if (f[l][r] != -1) return f[l][r];
	if (l == r) return 1;
	auto ret = 0ll;
	for (int i = l + 1; i <= r; i++) {
		if (i < r && b[i + 1] > b[l + 1])
			ret = (ret + (dp1(l + 1, i) * dp2(i + 1, r)) % mo) % mo;
		else if (i == r)
			ret = (ret + dp1(l + 1, i)) % mo;
	}
	return f[l][r] = ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	for(int i = 0; i <= n; i++)
		for (int j = 0; j <= n; j++) f[i][j] = g[i][j] = -1;
	for (int i = 1; i <= n; i++) std::cin >> b[i];
	std::cout << dp1(1, n) << '\n';
}

